<?php
/**
 * 功能模块控制器
 */

declare (strict_types = 1);

namespace app\controller\home;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;
use think\facade\Config;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

class Module extends BaseController
{
    /**
     * 从JWT token中获取用户ID（直接解析token，不依赖缓存）
     * @return int
     */
    private function getUserIdFromToken(): int
    {
        try {
            // 获取token
            $token = Request::header('Authorization');
            if (!$token) {
                $token = Request::param('token');
            }
            if (!$token) {
                return 0;
            }

            // 清理Bearer前缀
            if (strpos($token, 'Bearer ') === 0) {
                $token = substr($token, 7);
            }

            if (empty($token)) {
                return 0;
            }

            // 使用统一的JWT配置
            $jwtConfig = Config::get('jwt');
            if (!$jwtConfig || !isset($jwtConfig['key'])) {
                return 0;
            }

            // 设置时间容差
            JWT::$leeway = 60;

            // 解码JWT
            $decoded = JWT::decode($token, new Key($jwtConfig['key'], $jwtConfig['algorithm'] ?? 'HS256'));
            $decoded_array = json_decode(json_encode($decoded), true);

            // 检查过期时间
            if (isset($decoded_array['exp']) && $decoded_array['exp'] < time()) {
                return 0;
            }

            // 兼容新的JWT格式（sub字段）和原系统格式（data.userid字段）
            if (isset($decoded_array['sub'])) {
                return (int)$decoded_array['sub'];
            } elseif (isset($decoded_array['data']['userid'])) {
                return (int)$decoded_array['data']['userid'];
            }

            return 0;
        } catch (\Exception $e) {
            return 0;
        }
    }

    /**
     * 获取功能模块列表（向后兼容方法）
     */
    public function index()
    {
        return $this->list();
    }
    
    /**
     * 获取功能模块列表
     */
    public function list()
    {
        try {
            $param = Request::param();
            
            // 构建查询条件
            $where = [];
            
            // 关键词搜索
            if (!empty($param['keywords'])) {
                $where[] = ['title|name|desc', 'like', '%' . trim($param['keywords']) . '%'];
            }
            
            // 状态筛选
            if (isset($param['status']) && $param['status'] !== '') {
                $where[] = ['status', '=', $param['status']];
            }
            
            // 查询功能模块列表
            $list = Db::name('admin_module')
                ->where($where)
                ->order('id', 'desc')
                ->select()
                ->toArray();
            
            // 处理数据格式
            foreach ($list as &$item) {
                $item['create_time_format'] = $item['create_time'] ? date('Y-m-d H:i', $item['create_time']) : '';
                $item['update_time_format'] = $item['update_time'] ? date('Y-m-d H:i', $item['update_time']) : '';
                
                // 类型名称
                $typeNames = [
                    1 => '系统模块',
                    2 => '普通模块',
                    3 => '自定义模块'
                ];
                $item['type_name'] = isset($typeNames[$item['type']]) ? $typeNames[$item['type']] : '未知';
                
                // 来源名称
                $sourceNames = [
                    1 => '官方',
                    2 => '第三方'
                ];
                $item['source_name'] = isset($sourceNames[$item['sourse']]) ? $sourceNames[$item['sourse']] : '未知';
                
                // 状态名称
                $statusNames = [
                    0 => '禁用',
                    1 => '正常'
                ];
                $item['status_name'] = isset($statusNames[$item['status']]) ? $statusNames[$item['status']] : '未知';
            }
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $list
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '查询失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 查看功能模块详情
     */
    public function view()
    {
        try {
            $param = Request::param();
            
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            // 查询功能模块详情
            $module = Db::name('admin_module')
                ->where('id', $param['id'])
                ->find();
            
            if (empty($module)) {
                return json(['code' => 404, 'msg' => '功能模块不存在']);
            }
            
            $module['create_time_format'] = $module['create_time'] ? date('Y-m-d H:i', $module['create_time']) : '';
            $module['update_time_format'] = $module['update_time'] ? date('Y-m-d H:i', $module['update_time']) : '';
            
            // 类型名称
            $typeNames = [
                1 => '系统模块',
                2 => '普通模块',
                3 => '自定义模块'
            ];
            $module['type_name'] = isset($typeNames[$module['type']]) ? $typeNames[$module['type']] : '未知';
            
            // 来源名称
            $sourceNames = [
                1 => '官方',
                2 => '第三方'
            ];
            $module['source_name'] = isset($sourceNames[$module['sourse']]) ? $sourceNames[$module['sourse']] : '未知';
            
            // 状态名称
            $statusNames = [
                0 => '禁用',
                1 => '正常'
            ];
            $module['status_name'] = isset($statusNames[$module['status']]) ? $statusNames[$module['status']] : '未知';
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $module
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '查询失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 新建功能模块
     */
    public function add()
    {
        try {
            $param = Request::param();

            // 检查权限（只有超级管理员才能操作）- 直接从JWT token获取用户ID
            $userId = $this->getUserIdFromToken();
            if ($userId != 1) {
                return json(['code' => 403, 'msg' => '只有系统超级管理员才有权限操作模块！']);
            }
            
            // 数据验证
            if (empty($param['title'])) {
                return json(['code' => 400, 'msg' => '模块名称不能为空']);
            }
            
            if (empty($param['name'])) {
                return json(['code' => 400, 'msg' => '模块标识不能为空']);
            }
            
            // 检查模块标识是否已存在
            $exist = Db::name('admin_module')
                ->where('name', $param['name'])
                ->find();
            
            if ($exist) {
                return json(['code' => 400, 'msg' => '模块标识已存在']);
            }
            
            $data = [
                'title' => $param['title'],
                'name' => $param['name'],
                'desc' => $param['desc'] ?? '',
                'type' => $param['type'] ?? 2,
                'sourse' => $param['sourse'] ?? 1,
                'status' => $param['status'] ?? 1,
                'create_time' => time(),
                'update_time' => time()
            ];
            
            // 新增功能模块
            $moduleId = Db::name('admin_module')->insertGetId($data);
            
            return json(['code' => 0, 'msg' => '保存成功', 'data' => ['id' => $moduleId]]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '保存失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 编辑功能模块
     */
    public function edit()
    {
        try {
            $param = Request::param();

            // 检查权限（只有超级管理员才能操作）- 直接从JWT token获取用户ID
            $userId = $this->getUserIdFromToken();
            if ($userId != 1) {
                return json(['code' => 403, 'msg' => '只有系统超级管理员才有权限操作模块！']);
            }
            
            // 数据验证
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            if (empty($param['title'])) {
                return json(['code' => 400, 'msg' => '模块名称不能为空']);
            }
            
            if (empty($param['name'])) {
                return json(['code' => 400, 'msg' => '模块标识不能为空']);
            }
            
            // 检查功能模块是否存在
            $module = Db::name('admin_module')
                ->where('id', $param['id'])
                ->find();
            
            if (empty($module)) {
                return json(['code' => 404, 'msg' => '功能模块不存在']);
            }
            
            // 检查模块标识是否已存在（排除自己）
            $exist = Db::name('admin_module')
                ->where('name', $param['name'])
                ->where('id', '<>', $param['id'])
                ->find();
            
            if ($exist) {
                return json(['code' => 400, 'msg' => '模块标识已存在']);
            }
            
            $data = [
                'id' => $param['id'],
                'title' => $param['title'],
                'name' => $param['name'],
                'desc' => $param['desc'] ?? $module['desc'],
                'type' => $param['type'] ?? $module['type'],
                'sourse' => $param['sourse'] ?? $module['sourse'],
                'status' => $param['status'] ?? $module['status'],
                'update_time' => time()
            ];
            
            // 更新功能模块
            Db::name('admin_module')->update($data);
            
            return json(['code' => 0, 'msg' => '更新成功', 'data' => ['id' => $param['id']]]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '更新失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 删除功能模块
     */
    public function del()
    {
        try {
            $param = Request::param();

            // 检查权限（只有超级管理员才能操作）- 直接从JWT token获取用户ID
            $userId = $this->getUserIdFromToken();
            if ($userId != 1) {
                return json(['code' => 403, 'msg' => '只有系统超级管理员才有权限操作模块！']);
            }
            
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            // 检查功能模块是否存在
            $module = Db::name('admin_module')
                ->where('id', $param['id'])
                ->find();
            
            if (empty($module)) {
                return json(['code' => 404, 'msg' => '功能模块不存在']);
            }
            
            // 系统模块不能删除
            if ($module['type'] == 1) {
                return json(['code' => 400, 'msg' => '系统模块不能删除']);
            }
            
            // 删除功能模块
            Db::name('admin_module')
                ->where('id', $param['id'])
                ->delete();
            
            return json(['code' => 0, 'msg' => '删除成功']);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '删除失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 启用/禁用功能模块
     */
    public function toggleStatus()
    {
        try {
            $param = Request::param();

            // 检查权限（只有超级管理员才能操作）- 直接从JWT token获取用户ID
            $userId = $this->getUserIdFromToken();
            if ($userId != 1) {
                return json(['code' => 403, 'msg' => '只有系统超级管理员才有权限操作模块！']);
            }
            
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            // 检查功能模块是否存在
            $module = Db::name('admin_module')
                ->where('id', $param['id'])
                ->find();
            
            if (empty($module)) {
                return json(['code' => 404, 'msg' => '功能模块不存在']);
            }
            
            // 切换状态（0禁用，1正常）
            $status = $module['status'] == 1 ? 0 : 1;
            
            Db::name('admin_module')
                ->where('id', $param['id'])
                ->update([
                    'status' => $status,
                    'update_time' => time()
                ]);
            
            $statusText = $status == 1 ? '启用' : '禁用';
            return json(['code' => 0, 'msg' => $statusText . '成功']);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '操作失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 恢复功能模块
     */
    public function recovery()
    {
        try {
            $param = Request::param();

            // 检查权限（只有超级管理员才能操作）- 直接从JWT token获取用户ID
            $userId = $this->getUserIdFromToken();
            if ($userId != 1) {
                return json(['code' => 403, 'msg' => '只有系统超级管理员才有权限操作模块！']);
            }
            
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            // 检查功能模块是否存在
            $module = Db::name('admin_module')
                ->where('id', $param['id'])
                ->find();
            
            if (empty($module)) {
                return json(['code' => 404, 'msg' => '功能模块不存在']);
            }
            
            // 恢复模块（将状态设置为正常）
            Db::name('admin_module')
                ->where('id', $param['id'])
                ->update([
                    'status' => 1,
                    'update_time' => time()
                ]);
            
            return json(['code' => 0, 'msg' => '恢复成功']);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '恢复失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 安装功能模块
     */
    public function install()
    {
        try {
            $param = Request::param();

            // 检查权限（只有超级管理员才能操作）- 直接从JWT token获取用户ID
            $userId = $this->getUserIdFromToken();
            if ($userId != 1) {
                return json(['code' => 403, 'msg' => '只有系统超级管理员才有权限操作模块！']);
            }
            
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            // 检查功能模块是否存在
            $module = Db::name('admin_module')
                ->where('id', $param['id'])
                ->find();
            
            if (empty($module)) {
                return json(['code' => 404, 'msg' => '功能模块不存在']);
            }
            
            // 安装模块（将状态设置为正常）
            Db::name('admin_module')
                ->where('id', $param['id'])
                ->update([
                    'status' => 1,
                    'update_time' => time()
                ]);
            
            return json(['code' => 0, 'msg' => '安装成功']);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '安装失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 设置模块（获取启用的模块列表）
     */
    public function set()
    {
        try {
            // 查询启用的功能模块列表
            $list = Db::name('admin_module')
                ->where('status', 1)
                ->order('id', 'asc')
                ->select()
                ->toArray();
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $list
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '查询失败: ' . $e->getMessage()]);
        }
    }
}